package cn.stacey.day04.oop;

import org.junit.Test;

public class TestCoder {
	@Test
	public void test() {
		Coder coder = new Coder();
		coder.setId(1);
		
		System.out.println(coder);
	}
	
	// 多态演示
	@Test
	public void testPolymorphism() {
		// 父类类型可以指向不同子类
		Employee coder = new Coder();
		coder.setSalary(8000);
		// coder.setKpi();
		System.out.println(coder.getSalary());	// 调用的方法是父类的还是子类的？ 
					// 跟定义时的类型无关，调用的是实际创建的对象上面的方法。
		
		Employee designer = new Designer("设计师");
	}
	
	// 测试转型（类型转换） 
	// 使用了多态，就可能需要作类型转换
	
	@Test
	public void testCasting() {
		Coder coder = new Coder();
		Boss boss = new Boss();
		
		boss.pay(coder);
	}
	
	@Test
	public void testCasting2() {
		Designer designer = new Designer("p图大神");
				
		Boss boss = new Boss();
		boss.pay(designer);
	}
	
	@Test
	public void testPay() {
		Boss b = new Boss();

		// Employee coder = new Coder();
		Coder coder = new Coder();
		coder.setSalary(8000);
		
		// 方法定义的时候，参数类型是子类类型，不能传入父类类型
		b.pay(coder);
		
		// 方法定义的时候，参数类型是子类类型，不能传入另外一个子类类型
		Designer designer = new Designer("");
		designer.setSalary(8000);
		b.pay(designer);
		
		// 方法定义的时候，参数类型是父类类型，可以传入子类类型
	}
//
//	@Test
//	public void test1() {
//		Coder coder = new Coder("码农");
//		coder.setId(1);
//		
//		System.out.println(coder);
//	}
	
	@Test
	public void testOverride() {
//		Coder coder = new Coder();
//		coder.setSalary(8000);
//		coder.setKpi(1);
//		
//		Designer designer = new Designer();
//		designer.setSalary(8000);
//		
//		System.out.println(designer.getSalary());
//		System.out.println(coder.getSalary());
	}
}
